﻿Imports Microsoft.DirectX
Imports Microsoft.DirectX.Direct3D
Imports Commander_Wars.Spieletools
''' <summary>
''' Dieses Menü zeichnet den Siegbildschirm und alles was dazu gehört
''' </summary>
''' <remarks></remarks>
Public Class ObjektSiegMenü
    Inherits ObjektFormMenü
    Enum AufzeichnungsTypen
        Fonds
        Einkommen
        Basen
        Einheiten
        Spielerstärke
        Sieger
        Sonstiges
    End Enum
    Shared Farbtabellen As Color() = {}
    Dim Tage As Integer
    Dim Grafiken(4) As Grafik
    Dim AktuelleGrafik As AufzeichnungsTypen
    Dim LandschaftenInfo As ObjektLandkartenInfos
    Dim NächsteKarte As String
    Shared BesondereEreignisse As BesonderesEreigniss() = {}
    Dim MitSpieler As ObjektSpieler() = {}
    Dim SiegTexte(,) As Integer = {}
    Dim SiegerTeam As Char = "q"
    Dim Text As ObjektText
    Dim RankPunkte As Vector3() = {}
    Dim RankTimer As Integer = 0
    Public Sub New(ByVal Aufzeichnung As ObjektAufzeichnungen, ByVal SpielerFarbtabellen As Color(), ByVal LandschaftenInfo As ObjektLandkartenInfos, ByVal NächsteKarte As String, ByVal Spieler As ObjektSpieler())
        Me.LandschaftenInfo = LandschaftenInfo
        Me.NächsteKarte = NächsteKarte
        Me.MitSpieler = Spieler
        Farbtabellen = SpielerFarbtabellen
        'Wir legen die länge der Aufzeichnung fest
        If Not Aufzeichnung.Aufzeichnungen(Aufzeichnung.Aufzeichnungen.Length - 1).SpielerAufzeichnungen(0, 0) Is Nothing Then
            Tage = Aufzeichnung.Aufzeichnungen(Aufzeichnung.Aufzeichnungen.Length - 1).SpielerAufzeichnungen(0, 0).Tag
        Else
            Tage = Aufzeichnung.Aufzeichnungen(Aufzeichnung.Aufzeichnungen.Length - 2).SpielerAufzeichnungen(0, 0).Tag
        End If
        BesondereEreignisse = Aufzeichnung.BesondereEreignisse
        'Diese Schlacht hat ein Spieler gewonnen.
        If Objektverwalter.Spielfeld.Regeln.Spielende = True Then
            For I = 1 To Objektverwalter.Spielfeld.Regeln.Besiegt.Length - 1
                If Objektverwalter.Spielfeld.Regeln.Besiegt(I) = False Then
                    SiegerTeam = Spieler(I).Team
                End If
            Next
        End If
        If Hauptmenü.AufzeichnungAktiv Then
            'So mal sehen
            If Objektverwalter.Spielfeld.Regeln.Spielende = True Then
                'We have won this Map
                Dim File As String = My.Settings.Resourcenpfad + "Record\" + Objektverwalter.Spielfeld.Kartenname
                If My.Computer.FileSystem.FileExists(File + ".rpl") Then
                    Dim I As Integer = 0
                    While My.Computer.FileSystem.FileExists(File + "+" + I.ToString + ".rpl")
                        I += 1
                    End While
                    File += "+" + I.ToString
                End If
                Hauptmenü.AufzeichnungEnde(File + ".rpl")
            Else
                Hauptmenü.AufzeichnungAbbrechen()
            End If
        End If
        AktuelleGrafik = AufzeichnungsTypen.Fonds
        Dim B As Bitmap = CreateBackgroundGrafik(Aufzeichnung.Aufzeichnungen(Aufzeichnung.Aufzeichnungen.Length - 1).SpielerAufzeichnungen(0, 0).Tag)
        Grafiken(0) = New Grafik(AufzeichnungsTypen.Fonds, Aufzeichnung, B)


        Grafiken(1) = New Grafik(AufzeichnungsTypen.Einkommen, Aufzeichnung, B)
        Grafiken(2) = New Grafik(AufzeichnungsTypen.Basen, Aufzeichnung, B)
        Grafiken(3) = New Grafik(AufzeichnungsTypen.Einheiten, Aufzeichnung, B)
        Grafiken(4) = New Grafik(AufzeichnungsTypen.Spielerstärke, Aufzeichnung, B)

        Dim P As New ObjektPanel2D(New Rectangle(0, Hauptmenü.MainMenü.MalPanel.Height - 70, Hauptmenü.MainMenü.MalPanel.Width, 70), New PointF(0, 0), 4, False)
        Dim X As Integer = 20
        NeuButton(X, 20, My.Settings.Resourcenpfad + "Objekte\Button.png", "Fonds", New PointF(0, 0), , , , P)
        X += 120
        NeuButton(X, 20, My.Settings.Resourcenpfad + "Objekte\Button.png", "Einkommen", New PointF(0, 0), , , , P)
        X += 120
        NeuButton(X, 20, My.Settings.Resourcenpfad + "Objekte\Button.png", "Basen", New PointF(0, 0), , , , P)
        X += 120
        NeuButton(X, 20, My.Settings.Resourcenpfad + "Objekte\Button.png", "Einheiten", New PointF(0, 0), , , , P)
        X += 120
        NeuButton(X, 20, My.Settings.Resourcenpfad + "Objekte\Button.png", "Spielerstärke", New PointF(0, 0), , , , P)
        X += 120
        If SiegerTeam <> "q" Then
            NeuButton(X, 20, My.Settings.Resourcenpfad + "Objekte\Button.png", "Sieger", New PointF(0, 0), , , , P)
            X += 120
            Text = New ObjektText(New String() {}, 0, 0, Nothing, "Arial", 12, FontStyle.Regular)
            ReDim SiegTexte(Spieler.Length - 1, 1)
            ReDim RankPunkte(Spieler.Length - 2)
            For I = 0 To Spieler.Length - 1
                SiegTexte(I, 0) = -1
                SiegTexte(I, 1) = -1
                If Spieler(I).Team = SiegerTeam Then
                    For I2 = 0 To 1
                        If Not Spieler(I).KOS(I2) Is Nothing Then
                            SiegTexte(I, I2) = (Zufallszahl(0, Objektverwalter.KOS(Spieler(I).KOS(I2).Bild).KOBeschreibung.Siegsätze.Length - 1))
                        End If

                    Next
                End If
                If I > 0 Then
                    Aufzeichnung.CalculateRang(Objektverwalter.Spielfeld, I, RankPunkte(I - 1))
                End If
            Next
            NeuButton(X, 20, My.Settings.Resourcenpfad + "Objekte\Button.png", "Sonstiges", New PointF(0, 0), , , , P)
            X += 120
        End If

        NeuButton(X, 20, My.Settings.Resourcenpfad + "Objekte\Button.png", "Weiter", New PointF(0, 0), , , , P)
        X += 120

        NeuPanel(P)
    End Sub
    Public Overrides Sub ChangeWindowSize(ByVal PosChange As System.Drawing.Point)
        MyBase.ChangeWindowSizeObjekte(PosChange)
    End Sub

    Public Overrides Sub Frame()

    End Sub

    Public Overrides Sub IniMenü()
        If My.Settings.Verhältnis = Hauptmenü.Breitbild Then
            Objektverwalter.LoadHintergrund(My.Settings.Resourcenpfad + "Hintergründe\SiegMenüGroß.png")
        Else
            Objektverwalter.LoadHintergrund(My.Settings.Resourcenpfad + "Hintergründe\SiegMenü.png")
        End If

    End Sub

    Public Overrides Sub KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs)
        Select Case e.KeyCode
            Case Keys.Escape
                StatistikenBeenden()
            Case Keys.Space
                GrafikfertigMalen()
        End Select
    End Sub
    Private Sub GrafikfertigMalen()
        If Grafiken.Length > AktuelleGrafik Then
            Grafiken(AktuelleGrafik).Updating = True
            Grafiken(AktuelleGrafik).FertigMalen = True
        End If
    End Sub

    Private Function SiegDurchMensch() As Boolean
        For Each S In MitSpieler
            If S.KIStufe = ObjektSpieler.KIStufen.Mensch Then
                If S.Team = SiegerTeam Then
                    Return True
                End If
            End If
        Next
        Return False
    End Function

    Public Sub StatistikenBeenden()
        Reset()
        If LandschaftenInfo Is Nothing Then
            Dim nKarte As String = NächsteKarte
            If Not IsNothing(nKarte) Then
                If My.Computer.FileSystem.FileExists(My.Settings.Resourcenpfad + "Karten\" + nKarte + ".map") Then
                    'Also gut es gibt eine Folgekarte. (Im Moment auch wenn man verloren hat. Den Bug kann man später noch mit einer eleganten if-Anweisung beseitigen.
                    Hauptmenü.Ini(Hauptmenü.Formmodi.Kartenauswahl) 'Wir gehen in die Kartenauswahl und ...
                    '...legen die Karte fest (Auch wenn man sie bisher noch nicht auswählen konnte.
                    Dim M As ObjektKartenauswahlMenü
                    If TypeOf Objektverwalter.Menü Is ObjektKartenauswahlMenü Then

                        'Diese Bedingung müsste EIGENTLICH immer erfüllt sein.
                        M = Objektverwalter.Menü
                        ObjektKartenauswahlMenü.MomentaneKarte = 0 'OK, jetzt muss ich alles "von Hand" laden. Eigentlich unnötig, da dem Spieler gestattet wird selbst eine Karte auszuwählen. Auch wenn es nicht besonderes viele Alternativen gibt. :)
                        Array.Resize(M.SpielKarten, 1) 'Es gibt ja dann nur eine Karte zum auswählen :)
                        Array.Resize(M.Kartenname, 1) 'Der Pfad , Endung und so.
                        Array.Resize(ObjektKartenauswahlMenü.KartenNamen, 1) 'Der Name der im Spiel auftaucht.

                        'Array.Resize(M.Kartenauswahl.AngezeigteKarten, 1)
                        ObjektKartenauswahlMenü.AngezeigteKarten(0) = 0
                        For I = 0 To ObjektKartenauswahlMenü.AngezeigteKarten.Length - 1
                            ObjektKartenauswahlMenü.AngezeigteKarten(I) = 0
                        Next
                        If SiegDurchMensch() Then
                            Using Stream As New IO.FileStream(My.Settings.Resourcenpfad + "Karten\" + nKarte + ".map", IO.FileMode.Open, IO.FileAccess.Read)
                                Dim Konverter As New System.Runtime.Serialization.Formatters.Binary.BinaryFormatter

                                M.SpielKarten(0) = DirectCast(Konverter.Deserialize(Stream), ObjektSpielfeld)
                            End Using
                            M.Kartenname(0) = My.Settings.Resourcenpfad + "Karten\" + nKarte + ".map"
                            ObjektKartenauswahlMenü.KartenNamen(0) = M.SpielKarten(0).Kartenname
                        Else
                            'es gibt keine Folgekarte zurück zum Hauptmenü
                            Hauptmenü.Ini(Hauptmenü.Formmodi.Hauptmenü)
                        End If
                    Else
                        'es gibt keine Folgekarte zurück zum Hauptmenü
                        Hauptmenü.Ini(Hauptmenü.Formmodi.Hauptmenü)
                    End If
                Else
                    'es gibt keine Folgekarte zurück zum Hauptmenü
                    Hauptmenü.Ini(Hauptmenü.Formmodi.Hauptmenü)
                End If
            Else
                'es gibt keine Folgekarte zurück zum Hauptmenü
                Hauptmenü.Ini(Hauptmenü.Formmodi.Hauptmenü)
            End If
        Else
            'Wir wechseln zum Landkarteninfo Menü
            Hauptmenü.IniLandkartenMenü(LandschaftenInfo)
        End If

    End Sub

    Public Overrides Sub Malen()
        Dim BereitsGemalt As Boolean = True
        If AktuelleGrafik < AufzeichnungsTypen.Sieger Then
            If Grafiken(AktuelleGrafik).Malen() = True Then
                If AktuelleGrafik <= AufzeichnungsTypen.Spielerstärke Then
                    If AktuelleGrafik <= AufzeichnungsTypen.Spielerstärke And SiegerTeam <> "q" Then
                        AktuelleGrafik += 1

                        BereitsGemalt = False
                    End If
                ElseIf AktuelleGrafik = AufzeichnungsTypen.Spielerstärke And SiegerTeam <> "q" Then
                    AktuelleGrafik += 1

                    BereitsGemalt = False
                End If
            End If
            'Damit wir föüssige Bilder erhalten.
            If AktuelleGrafik < AufzeichnungsTypen.Sieger Then
                If Grafiken(AktuelleGrafik).Textur1 Is Nothing Then
                    If BereitsGemalt = False Then
                        Grafiken(AktuelleGrafik - 1).Malen()
                    ElseIf Grafiken(AktuelleGrafik).Textur2 IsNot Nothing Then
                        If Grafiken(AktuelleGrafik).LoadingThread Is Nothing Then
                            Grafiken(AktuelleGrafik).Textur1 = Grafiken(AktuelleGrafik).Textur2
                        ElseIf Not Grafiken(AktuelleGrafik).LoadingThread.IsAlive Then
                            Grafiken(AktuelleGrafik).Textur1 = Grafiken(AktuelleGrafik).Textur2
                        End If
                    End If
                End If
            Else
                Select Case AktuelleGrafik
                    Case AufzeichnungsTypen.Sieger
                        DrawSieger()
                    Case AufzeichnungsTypen.Sonstiges
                        DrawSonstiges()
                End Select

                End If
                Else
                    Select Case AktuelleGrafik
                        Case AufzeichnungsTypen.Sieger
                            DrawSieger()
                        Case AufzeichnungsTypen.Sonstiges
                            DrawSonstiges()
                    End Select
                End If
                Dim Größe As Integer = 2
                Dim Text As String = Sprachconverter.Translate(AktuelleGrafik.ToString)
                'Jetzt Malen wir eine Überschrift.
                Dim P As New Point(Hauptmenü.MainMenü.MalPanel.Width / 2 - (ObjektAlphabet.BuchstabenBreite * Größe * Text.Length / 2), (50 - ObjektAlphabet.BuchstabenHöhe * Größe / 2))
                ObjektAlphabet.DrawString(Text, 1, P, 2)

                MyBase.ObjekteMalen()
    End Sub
    ''' <summary>
    ''' Malt den Sieg Bildschirm mit Sieger KO's
    ''' und verlierer KO's
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub DrawSieger()
        Dim sngrotation As Single = 0
        Dim intcolor As Color = Color.FromArgb(255, 255, 255, 255)
        Grafikengine.szfScale = Nothing
        Grafikengine.recBild = Nothing
        Grafikengine.ptfRotCenter = New Point

        Dim Y As Integer = 140
        For Each Player In MitSpieler
            If Player.Spieler > 0 Then
                Grafikengine.ptfPosition.Y = Y
                If Player.Team = SiegerTeam Then
                    Grafikengine.szfScale = Nothing
                    Grafikengine.recBild = Nothing
                    For I = 0 To Hauptmenü.MainMenü.MalPanel.Width / 100 + 1
                        Grafikengine.ptfPosition.X = I * 100
                        Grafikengine.Sprite.Draw2D(TexturenHalter.GetSiegMenüSiegerTextur, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngrotation, Grafikengine.ptfPosition, intcolor)
                    Next
                    For I = 0 To 1
                        If Not Player.KOS(I) Is Nothing Then
                            Player.KOS(I).KOGesichtsausdruckMalen(1, I * 52 + 5, Y)
                            'So jetzt noch der Siegsatz
                            Text.neuerText(New String() {Objektverwalter.KOS(Player.KOS(I).Bild).KOBeschreibung.Siegsätze(SiegTexte(Player.Spieler, I))}, 48 * 2 + 10, Y + 2 + I * 20, Nothing)
                            Schriftengine.DrawText(Text)
                        End If
                    Next
                Else
                    Grafikengine.szfScale = Nothing
                    Grafikengine.recBild = Nothing
                    For I = 0 To Hauptmenü.MainMenü.MalPanel.Width / 100 + 1
                        Grafikengine.ptfPosition.X = I * 100
                        Grafikengine.Sprite.Draw2D(TexturenHalter.GetSiegMenüVerliererTextur, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngrotation, Grafikengine.ptfPosition, intcolor)
                    Next
                    For I = 0 To 1
                        If Not Player.KOS(I) Is Nothing Then
                            Player.KOS(I).KOGesichtsausdruckMalen(2, I * 52 + 5, Y)
                        End If
                    Next
                End If
                Y += 55
            End If
        Next
    End Sub
    ''' <summary>
    ''' Malt das Menü Sonstiges
    ''' </summary>
    ''' <remarks></remarks>
    Private Sub DrawSonstiges()
        Dim sngrotation As Single = 0
        Dim intcolor As Color = Color.FromArgb(255, 255, 255, 255)
        Grafikengine.szfScale = Nothing
        Grafikengine.recBild = Nothing
        Grafikengine.ptfRotCenter = New Point
        Dim Y As Integer = 140
        Dim Spieler As Integer = 1
        For Each Rank In RankPunkte
            Dim Punkte As Integer = Rank.X + Rank.Y + Rank.Z
            Dim SpielerRank As ObjektAufzeichnungen.Rang = ObjektAufzeichnungen.GetRank(Punkte)
            Dim T As String = Sprachconverter.Translate("Spieler") + " " + Spieler.ToString + "   "
            Dim PunkteNow As Integer = RankTimer
            If Rank.X < RankTimer Then
                PunkteNow = Rank.X
            End If
            T += Sprachconverter.Translate("Tempo") + " :" + PunkteNow.ToString + "   "
            PunkteNow = RankTimer
            If Rank.Y < RankTimer Then
                PunkteNow = Rank.Y
            End If
            T += Sprachconverter.Translate("Kraft") + " :" + PunkteNow.ToString + "   "
            PunkteNow = RankTimer
            If Rank.Z < RankTimer Then
                PunkteNow = Rank.Z
            End If
            T += Sprachconverter.Translate("Technik") + " :" + PunkteNow.ToString + "   "
            ObjektAlphabet.DrawString(T, 1, New Point(30, Y), 0)
            If Rank.X < RankTimer Then
                If Rank.Y < RankTimer Then
                    If Rank.Z < RankTimer Then
                        Grafikengine.ptfPosition.X = 50 + T.Length * Hauptmenü.FeldbreiteKlein
                        Grafikengine.ptfPosition.Y = Y
                        Grafikengine.szfScale = Nothing
                        Grafikengine.recBild = Nothing
                        Grafikengine.ptfRotCenter = New Point
                        Grafikengine.Sprite.Draw2D(TexturenHalter.GetRankTextur(SpielerRank), Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngrotation, Grafikengine.ptfPosition, intcolor)
                    End If
                End If
            End If
           
            Spieler += 1
            Y += 55
        Next
        If RankTimer < 1000 Then
            RankTimer += 1
        End If
    End Sub
    Public Overrides Sub MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
        Select Case e.Button
            Case Windows.Forms.MouseButtons.Left
                checkMouseDownObjekte(ObjektMaus.XKoordinate, ObjektMaus.YKoordinate)
        End Select
    End Sub

    Public Overrides Sub MouseMove(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
        MouseMoveObjekte(e.X, e.Y)
    End Sub

    Public Overrides Sub MouseUp(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
        Select Case e.Button
            Case Windows.Forms.MouseButtons.Left
                ButtonGeklicktLinks(checkMouseUPObjekte(ObjektMaus.XKoordinate, ObjektMaus.YKoordinate))
        End Select
    End Sub
    Public Sub ButtonGeklicktLinks(ByVal Effekt As String)
        If Effekt = Nothing Then
            Exit Sub
        End If
        Select Case Effekt.ToLower
            Case "fonds"
                AktuelleGrafik = AufzeichnungsTypen.Fonds
            Case "einkommen"
                AktuelleGrafik = AufzeichnungsTypen.Einkommen
            Case "basen"
                AktuelleGrafik = AufzeichnungsTypen.Basen
            Case "einheiten"
                AktuelleGrafik = AufzeichnungsTypen.Einheiten
            Case "spielerstärke"
                AktuelleGrafik = AufzeichnungsTypen.Spielerstärke
            Case "sieger"
                AktuelleGrafik = AufzeichnungsTypen.Sieger
            Case "weiter"
                StatistikenBeenden()
            Case "sonstiges"
                AktuelleGrafik = AufzeichnungsTypen.Sonstiges
        End Select
    End Sub
    Public Overrides Sub MouseWheel(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)

    End Sub

    Public Overrides Sub SetMausBild()

    End Sub

    Public Overrides Sub SprachEingabe(ByVal Eingabe As String)

    End Sub

    Private Function CreateBackgroundGrafik(ByVal LetzterTag As Integer) As Bitmap
        Dim Bild As Bitmap
        Dim S As New Size(Hauptmenü.MainMenü.MalPanel.Width - 200, Hauptmenü.MainMenü.MalPanel.Height - 200)
        Bild = New Bitmap(S.Width, S.Height)
        Dim G As Graphics = Graphics.FromImage(Bild)
        Dim RY As Integer
        Dim XMax As Integer = Math.DivRem(S.Width, 16, RY)
        If RY <> 0 Then XMax += 1
        Dim YMax As Integer = Math.DivRem(S.Height, 16, RY)
        If RY <> 0 Then YMax += 1
        Dim Rechteck As Bitmap = Image.FromFile(My.Settings.Resourcenpfad + "RechteckFürGrafik.png")
        For X = 0 To XMax
            For Y = 0 To YMax
                G.DrawImage(Rechteck, New Point(X * 16, Y * 16 - RY))
            Next
        Next


        'Wir zeichnen die Y. Striche rein um unseren Wert zuordnen zu können.
        Dim YMaxTeile As Integer = Math.DivRem(Bild.Height, 16, 0)
        Dim XMaxTeile As Integer = Math.DivRem(Bild.Width, 16, 0)
        Dim Rand As Integer = Bild.Height - YMaxTeile * 16
        Dim Teiler As Integer = 5
        YMax = Math.DivRem(YMaxTeile, Teiler, 0)
        Dim Y1 As Integer = Rand
        Dim Stift As New Pen(Color.FromArgb(200, 0, 1, 0), 1)
        For Y = 0 To YMax
            G.DrawLine(Stift, 0, Y1, Bild.Width, Y1)
            Y1 += Teiler * 16
        Next

        'Wir zeichnen die X. Striche rein um unseren Wert zuordnen zu können.
        Teiler = 5
        Dim Größe As Single = 1
        Dim LängsterText As Integer = LetzterTag.ToString.Length * Größe * ObjektAlphabet.BuchstabenBreite
        While LängsterText > Teiler * 16
            Teiler += 5
        End While
        YMax = Math.DivRem(XMaxTeile, Teiler, 0)
        For X = 1 To YMax
            Y1 = Teiler * 16 * X
            G.DrawLine(Stift, Y1, 0, Y1, Bild.Height)
        Next
        Return Bild
    End Function
    ''' <summary>
    ''' Diese Klasse zeichnet eine Grafik auf den Bildschirm
    ''' </summary>
    ''' <remarks></remarks>
    Private Class Grafik
        Const UpdateFrame As Integer = 10
        Dim YMaxTeile As Integer = 0
        Dim XMaxTeile As Integer = 0
        Dim BildHöhe As Integer
        Dim Bildbreite As Integer
        Dim Bild As Bitmap
        ''' <summary>
        ''' Diese Textur wird angezeigt
        ''' </summary>
        ''' <remarks></remarks>
        Public Textur1 As Texture
        ''' <summary>
        ''' Dies ist unser Backpuffer
        ''' </summary>
        ''' <remarks></remarks>
        Public Textur2 As Texture
        ''' <summary>
        ''' Lädt das Bild in den Backpuffer.
        ''' </summary>
        ''' <remarks></remarks>
        Public LoadingThread As Threading.Thread
        ''' <summary>
        ''' True wenn wir ein Update machen sollen.
        ''' </summary>
        ''' <remarks></remarks>
        Public Updating As Boolean = False
        ''' <summary>
        ''' Hier haben wir zu letzt ein Update gemacht.
        ''' </summary>
        ''' <remarks></remarks>
        Dim MomentaneStelle As Integer = 1
        Dim AufzeichnungsWerte As Integer(,) = {}
        Dim MaximalWert As Integer = 0
        Dim LetzterTag As Integer = 0
        Dim Frame As Integer = 0
        Public FertigMalen As Boolean = False
        Public Sub New(ByVal AufzeichnungsTyp As AufzeichnungsTypen, ByVal Aufzeichnung As ObjektAufzeichnungen, ByVal B As Bitmap)
            Bild = B.Clone()
            BildHöhe = Bild.Height
            Bildbreite = Bild.Width
            LetzterTag = Aufzeichnung.Aufzeichnungen(Aufzeichnung.Aufzeichnungen.Length - 1).SpielerAufzeichnungen(0, 0).Tag
            'Array anpassen
            Dim Spieler1 As Integer = Aufzeichnung.Aufzeichnungen(0).SpielerAufzeichnungen.GetLength(0) - 1
            ReDim AufzeichnungsWerte(Aufzeichnung.Aufzeichnungen.Length * 2 - 1, Aufzeichnung.Aufzeichnungen(0).SpielerAufzeichnungen.GetLength(0) - 1)
            For I = 0 To Aufzeichnung.Aufzeichnungen.Length - 1
                For I2 = 0 To 1
                    Dim Stelle As Integer = I
                    If I > 0 Then Stelle += I
                    If I2 > 0 Then Stelle += 1
                    For Spieler = 0 To Spieler1
                        'Werte auslesen
                        If Not Aufzeichnung.Aufzeichnungen(I).SpielerAufzeichnungen(Spieler, I2) Is Nothing Then
                            Select Case AufzeichnungsTyp
                                Case AufzeichnungsTypen.Basen
                                    AufzeichnungsWerte(Stelle, Spieler) = Aufzeichnung.Aufzeichnungen(I).SpielerAufzeichnungen(Spieler, I2).Basen
                                Case AufzeichnungsTypen.Einheiten
                                    AufzeichnungsWerte(Stelle, Spieler) = Aufzeichnung.Aufzeichnungen(I).SpielerAufzeichnungen(Spieler, I2).Einheiten
                                Case AufzeichnungsTypen.Einkommen
                                    AufzeichnungsWerte(Stelle, Spieler) = Aufzeichnung.Aufzeichnungen(I).SpielerAufzeichnungen(Spieler, I2).Einkommen
                                Case AufzeichnungsTypen.Fonds
                                    AufzeichnungsWerte(Stelle, Spieler) = Aufzeichnung.Aufzeichnungen(I).SpielerAufzeichnungen(Spieler, I2).Fonds
                                Case AufzeichnungsTypen.Spielerstärke
                                    AufzeichnungsWerte(Stelle, Spieler) = Aufzeichnung.Aufzeichnungen(I).SpielerAufzeichnungen(Spieler, I2).SpielerStärke
                            End Select
                            If AufzeichnungsWerte(Stelle, Spieler) > MaximalWert Then
                                MaximalWert = AufzeichnungsWerte(Stelle, Spieler)
                            End If
                        Else
                            Select Case AufzeichnungsTyp
                                Case AufzeichnungsTypen.Basen
                                    AufzeichnungsWerte(Stelle, Spieler) = -1
                                Case AufzeichnungsTypen.Einheiten
                                    AufzeichnungsWerte(Stelle, Spieler) = -1
                                Case AufzeichnungsTypen.Einkommen
                                    AufzeichnungsWerte(Stelle, Spieler) = -1
                                Case AufzeichnungsTypen.Fonds
                                    AufzeichnungsWerte(Stelle, Spieler) = -1
                                Case AufzeichnungsTypen.Spielerstärke
                                    AufzeichnungsWerte(Stelle, Spieler) = -1
                            End Select
                        End If
                    Next
                Next
            Next

            YMaxTeile = Math.DivRem(Bild.Height, 16, 0)
            XMaxTeile = Math.DivRem(Bild.Width, 16, 0)
            If AufzeichnungsTyp = AufzeichnungsTypen.Fonds Then Textur1 = Grafikengine.LoadTexture(Bild)
            LoadingThread = New Threading.Thread(AddressOf UpdateGrafik)
            LoadingThread.Name = AufzeichnungsTyp.ToString
            LoadingThread.Start()
        End Sub
        Public Function Malen() As Boolean
            Dim sngrotation As Single = 0
            Dim intcolor As Color = Color.FromArgb(255, 255, 255, 255)
            Grafikengine.szfScale = Nothing
            Grafikengine.ptfRotCenter = New Point
            Grafikengine.recBild = Nothing
            Grafikengine.ptfPosition = New Point(100, 100)
            If Not Textur1 Is Nothing Then
                Grafikengine.Sprite.Draw2D(Textur1, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
                DrawAchsenBeschriftung()
            End If
            Frame += 1
            If Not LoadingThread Is Nothing Then
                If LoadingThread.ThreadState = Threading.ThreadState.Stopped Then
                    If Frame > UpdateFrame Then
                        LoadingThread.Abort()
                        LoadingThread = Nothing
                        Return True
                    End If
                Else
                    If Frame > UpdateFrame Then
                        If Updating = False Then
                            If Not Textur1 Is Nothing Then Textur1.Dispose()
                            Textur1 = Textur2
                            Textur2 = Nothing
                            Updating = True
                            Frame = 0
                        End If
                    End If
                End If
            End If
            Return False
        End Function
        Private Sub DrawAchsenBeschriftung()
            'Y-Achse
            Dim Teiler As Integer = 5
            Dim Rand As Integer = BildHöhe - YMaxTeile * 16
            Dim YMax As Integer = Math.DivRem(YMaxTeile, Teiler, 0)
            Dim Steps As Single = MaximalWert / YMaxTeile

            Dim Größe As Single = 1
            Dim P As New Point(0, 100 + Rand - (Größe * ObjektAlphabet.BuchstabenHöhe) / 2)
            For Y = 0 To YMax
                Dim Wert As String = CInt((MaximalWert - Steps * Y * Teiler)).ToString

                P.X = 100 - Wert.Length * ObjektAlphabet.BuchstabenBreite * Größe - 5

                ObjektAlphabet.DrawString(Wert, Größe, P, 0)
                'Fünf, weil wir nur jedes fünfte Kästschen beschriften. 16 die Höhe eines Kästchens
                P.Y += Teiler * 16
            Next
            Teiler = 5
            'X-Achse
            Dim LängsterText As Integer = LetzterTag.ToString.Length * Größe * ObjektAlphabet.BuchstabenBreite
            While LängsterText > Teiler * 16
                Teiler += 5
            End While
            YMax = Math.DivRem(XMaxTeile, Teiler, 0)
            P = New Point(100, 100 + BildHöhe + 10)
            Steps = LetzterTag / XMaxTeile
            For X = 1 To YMax
                Dim Wert As String = CInt((Steps * X * Teiler)).ToString
                P.X = (100 + X * Teiler * 16 - Wert.Length * Größe * ObjektAlphabet.BuchstabenBreite / 2)
                ObjektAlphabet.DrawString(Wert, Größe, P, 0)
            Next
        End Sub
        Public Sub UpdateGrafik()
            Dim X As Integer = 0
            Dim XPlus As Integer = Math.DivRem(Bild.Width, AufzeichnungsWerte.GetLength(0), 0)
            If MaximalWert = 0 Then MaximalWert = 1
            Dim Max As Integer = AufzeichnungsWerte.GetLength(0)
            Dim Stelle As Integer = 0
            Dim FGemalt As Boolean = False
            While Stelle < Max And Not FGemalt
                If FertigMalen = True Then

                    Stelle = UpdateGrafik(Stelle, X, XPlus, Max - Stelle - 1)
                    FGemalt = True
                Else
                    Stelle = UpdateGrafik(Stelle, X, XPlus, 0)
                End If
                Textur2 = Grafikengine.LoadTexture(Bild)
                Updating = False
                While Updating = False
                    Threading.Thread.Sleep(2)
                End While
            End While
        End Sub
        Private Function UpdateGrafik(ByVal Start As Integer, ByRef X As Integer, ByVal XPlus As Integer, ByVal Steps As Integer) As Integer

            For I = Start To Start + Steps
                Dim R As Integer
                Dim Tag As Integer = Math.DivRem(I + 2, 2, R)
                If R <> 0 Then Tag = -1
                'so wir starten das Update
                Dim G As Graphics = Graphics.FromImage(Bild)
                'Kurven malen
                SyncLock ObjektSiegMenü.Farbtabellen
                    SyncLock ObjektSiegMenü.BesondereEreignisse
                        For Spieler = 0 To AufzeichnungsWerte.GetLength(1) - 1

                            Dim Stift As New Pen(ObjektSiegMenü.Farbtabellen(Spieler), 3)

                            Dim YMin As Integer = Bild.Height - YMaxTeile * 16 * (AufzeichnungsWerte(I, Spieler) / MaximalWert)
                            Dim YMax As Integer = Bild.Height - YMaxTeile * 16 * (AufzeichnungsWerte(I, Spieler) / MaximalWert)
                            If AufzeichnungsWerte(I, Spieler) >= 0 Then
                                If I = 0 Then
                                    G.DrawLine(Stift, X, YMin, X + XPlus, YMax)
                                ElseIf I = AufzeichnungsWerte.GetLength(0) - 1 Then
                                    YMin = Bild.Height - YMaxTeile * 16 * (AufzeichnungsWerte(I - 1, Spieler) / MaximalWert)
                                    G.DrawLine(Stift, X, YMin, Bild.Width, YMax)
                                Else
                                    YMin = Bild.Height - YMaxTeile * 16 * (AufzeichnungsWerte(I - 1, Spieler) / MaximalWert)
                                    G.DrawLine(Stift, X, YMin, X + XPlus, YMax)
                                End If
                            End If
                        Next
                        'Symbole Malen.
                        For I2 = 0 To ObjektSiegMenü.BesondereEreignisse.Length - 1
                            'Aufgezeichnete Ereignisse
                            If ObjektSiegMenü.BesondereEreignisse(I2).Tag = Tag Then
                                Dim YMin As Integer
                                If I > 0 Then
                                    YMin = Bild.Height - YMaxTeile * 16 * (AufzeichnungsWerte(I - 1, ObjektSiegMenü.BesondereEreignisse(I2).Spieler - 1) / MaximalWert)
                                Else
                                    YMin = Bild.Height - YMaxTeile * 16 * (AufzeichnungsWerte(I, ObjektSiegMenü.BesondereEreignisse(I2).Spieler - 1) / MaximalWert)
                                End If
                                Dim B As Image
                                Dim F As Bitmap = Hauptmenü.Farbtabelleerstellen(ObjektSiegMenü.Farbtabellen(ObjektSiegMenü.BesondereEreignisse(I2).Spieler - 1))
                                Select Case ObjektSiegMenü.BesondereEreignisse(I2).Ereignis
                                    Case BesonderesEreigniss.Ereignisse.Gabe
                                        B = Image.FromFile(My.Settings.Resourcenpfad + "MenüIcons\Gabe.png")
                                    Case BesonderesEreigniss.Ereignisse.Spezialgabe
                                        B = Image.FromFile(My.Settings.Resourcenpfad + "MenüIcons\SpezialGabe.png")
                                    Case BesonderesEreigniss.Ereignisse.Doppelgabe
                                        B = Image.FromFile(My.Settings.Resourcenpfad + "MenüIcons\Doppelgabe.png")
                                    Case BesonderesEreigniss.Ereignisse.HQEroberung
                                        B = Grafikengine.Bildverändern(Image.FromFile(My.Settings.Resourcenpfad + "MenüIcons\HQ+Eroberung.png"), My.Resources.Neutral, 0, 0, F)
                                    Case BesonderesEreigniss.Ereignisse.HQVerlust
                                        B = Grafikengine.Bildverändern(Image.FromFile(My.Settings.Resourcenpfad + "MenüIcons\HQ+Verlust.png"), My.Resources.Neutral, 0, 0, F)
                                    Case Else
                                        B = Image.FromFile(My.Settings.Resourcenpfad + "MenüIcons\Gabe.png")
                                End Select
                                G.DrawImage(B, New Point(X - B.Width / 2, YMin - B.Height / 2))
                            End If
                        Next
                        'Besonderes Ereignis wie Niederlage.
                        For Spieler = 0 To AufzeichnungsWerte.GetLength(1) - 1
                            If AufzeichnungsWerte(I, Spieler) < 0 Then
                                If I - 1 >= 0 Then
                                    If AufzeichnungsWerte(I - 1, Spieler) >= 0 Then
                                        'Niederlagensymbol malen
                                        Dim B As Image = Image.FromFile(My.Settings.Resourcenpfad + "MenüIcons\Niederlage.png")
                                        Dim YMax As Integer = Bild.Height - YMaxTeile * 16 * (AufzeichnungsWerte(I - 1, Spieler) / MaximalWert)
                                        G.DrawImage(B, New Point(X - B.Width / 2, YMax - B.Height / 2))
                                    End If
                                Else
                                    'Niederlagensymbol malen
                                    Dim B As Image = Image.FromFile(My.Settings.Resourcenpfad + "MenüIcons\Niederlage.png")
                                    Dim YMax As Integer = Bild.Height - YMaxTeile * 16 * (AufzeichnungsWerte(I, Spieler) / MaximalWert)
                                    G.DrawImage(B, New Point(X - B.Width / 2, YMax - B.Height / 2))
                                End If
                            End If
                        Next
                    End SyncLock
                End SyncLock
                X += XPlus
            Next
            If Steps = 0 Then
                Return Start + 1
            Else
                Return Start + Steps
            End If
        End Function
        Public Sub DisposeThread()
            If Not LoadingThread Is Nothing Then
                LoadingThread.Abort()
            End If
        End Sub
    End Class
    Public Overrides Sub Reset()
        For I = 0 To Grafiken.Length - 1
            Grafiken(I).DisposeThread()
        Next
    End Sub
  
End Class
